package cn.itcast.nems.product.dao.mapper;

import cn.itcast.nems.common.bean.ProductState;
import cn.itcast.nems.product.dao.dataobject.ProductDO;
import cn.itcast.nems.product.dao.dataobject.ProductPriceDO;
import cn.itcast.nems.product.dao.entity.Product;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;
import java.util.Set;

/**
 * <p>
 * 产品 Mapper 接口
 * </p>
 *
 * @author liyong
 * @since 2023-08-31
 */
@Mapper
public interface ProductMapper extends BaseMapper<Product> {
    /**
     * 跟进订单低获取订单行对应低产品信息
     * @param orderId 订单ID
     * @return 订单行对应低产品信息
     */
    List<ProductDO> findListByOrderId(@Param("orderId") String orderId) ;

    /**
     * 更新已结课班级（产品）状态为下架
     *
     * @return
     */
    int updateInvalidState(@Param("limitDate") LocalDate limitDate);

    /**
     * 
     * 功能描述：更新产品售出数量
     *
     * @param productId 产品ID
     * @param quantity 需要增加或减少的商品数量。卖出为：正数、退货为：负数
     * @return 是否更新成功
     * 
     * @author 刘曙
     *
     * @since 2023年9月17日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    int updateQuantitySold(Long productId, Integer quantity);
    
    /**
     * 分页查询
     * @param page 分页参数
     * @param priceDO 搜索条件
     * @return 分页数据
     */
    IPage<ProductPriceDO> findPageList(Page<ProductPriceDO> page,@Param("priceDO") ProductPriceDO priceDO) ;

    /**
     * 根据校区、授课模式、学科或班级类型查询 产品定价信息
     * @param priceDO 搜索条件
     * @return 产品定价信息分页数据
     */
    IPage<ProductPriceDO> findClazzPageList(Page<ProductPriceDO> page,@Param("priceDO") ProductPriceDO priceDO) ;

    /* 查询产品信息
     *
     * @param startDate      有效期起始日期
     * @param endDate        有效期结束日期
     * @param state          状态
     * @param includeExpired 是否包含过期产品
     * @return 产品信息
     */
    List<ProductDO> selectProducts(@Param("startDate") LocalDate startDate,
                                   @Param("endDate") LocalDate endDate,
                                   @Param("state") ProductState state,
                                   @Param("includeExpired") Boolean includeExpired);

    /**
     * 查询产品信息
     *
     * @param classTypeId 班级类型ID
     * @param campusIds   校区ID
     * @return 产品信息
     */
    List<ProductDO> selectProductsByClassTypeId(@Param("classTypeId") String classTypeId,
                                                @Param("campusIds") Set<String> campusIds);
    /**
     * 根据产品编号查询产品
     *
     * @param bizNo 产品编号
     * @return 产品
     */
    ProductDO selectProduct(@Param("bizNo") String bizNo);

    /**
     * 根据班级ID查询产品
     *
     * @param bizNo 产品编号
     * @return 产品
     */
    List<ProductDO> selectProductsByLikeBizNo(@Param("bizNo") String bizNo);
    
    /**
     * 根据biz_no 或 ID 查询上架产品
     *
     * @param bizNo 产品编号
     * @param id  产品ID
     * @return 产品
     */
    List<ProductDO> selectValidProductsByIdOrLikeBizNo(@Param("bizNo") String bizNo, @Param("id") Long id ,
                                                       @Param("phaseNum") Integer phaseNum);
    
    /**
     * 
     * 功能描述：卖出计数
     *
     * @param productId 产品ID
     * @param quantity 卖出数量
     * @return 更新数量，更新成功为1
     * 
     * @author 刘曙
     *
     * @since 2023年9月20日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    int increaseInventorySoldQuantity(@Param("productId") Long productId, @Param("quantity") Integer quantity);
    
    /**
     * 
     * 功能描述：退货重新计数
     *
     * @param productId 产品ID
     * @param quantity 退货数量
     * @return 更新数量，更新成功为1
     * 
     * @author 刘曙
     *
     * @since 2023年9月20日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    int decreaseInventorySoldQuantity(@Param("productId") Long productId, @Param("quantity") Integer quantity);
    
    /**
     * 
     * 功能描述：增加库存数量
     *
     * @param productId 产品ID
     * @param quantity 要增加的库存数量
     * @return 更新数量，更新成功为1
     * 
     * @author 刘曙
     *
     * @since 2023年9月20日
     *
     * @update:[变更日期YYYY-MM-DD][更改人姓名][变更描述]
     */
    int increaseInventoryQuantity(@Param("productId") Long productId, @Param("quantity") Integer quantity);
}
